// 用户登录和注册的表单项验证的通用代码
class FieldValidator{
    /**
     * 构造器
     * @param {String} txtId 文本框的id
     * @param {Function} validatorFunc 验证规则函数，需要对文本框验证的时候，调用该函数，函数的参数为当前文本框的值，函数的返回值为验证的错误消息，如果没有返回或者为null等，就验证成功
     */
    constructor(txtId,validatorFunc){
        this.input = $('#'+txtId);
        this.p = this.input.nextElementSibling;
        this.validatorFunc = validatorFunc;
        this.input.onblur = ()=>{
            this.validate();
        }
    }


    // 开始验证，成功返回true,失败返回false
    async validate(){
        const err = await this.validatorFunc(this.input.value);
        if(err){
            // 有错误
            this.p.innerText = err;
            return false; 
        }else{
            // 没有错误
            this.p.innerText = '';
            return true;
        }
    }

    /**
     * 对传入的所有验证器进行统一验证
     * 如果所有的验证都通过返回true，有一个不通过就返回false
     * @param {FlieValidator[]} validators 
     */
    static async validate(...validators){
        // 将所有要验证的部分进行验证
        const proms = validators.map(v=>v.validate());
        // 等待所有promise完成，然后拿到素有promise的结果
        const result = await Promise.all(proms);
        // 判断是不是每一个结果都满足条件,返回结果
        return result.every(r=>r);
    }
}
